#ifndef ITASK_H
#define ITASK_H

#include <QString>
#include <QVariant>
#include <memory>

/**
 * @brief 任务抽象接口
 * 
 * 定义了所有任务必须实现的基本接口
 * 遵循Martin Fowler的接口隔离原则
 */
class ITask {
public:
    virtual ~ITask() = default;
    
    /**
     * @brief 执行任务的主要逻辑
     */
    virtual void execute() = 0;
    
    /**
     * @brief 获取任务唯一标识符
     * @return 任务ID
     */
    virtual QString getTaskId() const = 0;
    
    /**
     * @brief 获取任务优先级
     * @return 优先级值，数值越高优先级越高
     */
    virtual int getPriority() const = 0;
    
    /**
     * @brief 获取任务预估内存使用量（字节）
     * @return 预估内存使用量
     */
    virtual qint64 getEstimatedMemory() const = 0;
    
    /**
     * @brief 获取任务预估执行时间（毫秒）
     * @return 预估执行时间
     */
    virtual qint64 getEstimatedDuration() const = 0;
    
    /**
     * @brief 检查任务是否可以取消
     * @return 是否支持取消
     */
    virtual bool isCancellable() const { return true; }
    
    /**
     * @brief 取消任务执行
     */
    virtual void cancel() {}
    
    /**
     * @brief 获取任务类型
     * @return 任务类型字符串
     */
    virtual QString getTaskType() const = 0;
};

/**
 * @brief 进度观察者接口
 * 
 * 实现Observer模式，用于接收任务进度通知
 */
class IProgressObserver {
public:
    virtual ~IProgressObserver() = default;
    
    /**
     * @brief 任务进度更新通知
     * @param taskId 任务ID
     * @param progress 进度百分比 (0-100)
     * @param status 状态描述
     */
    virtual void onProgressUpdated(const QString& taskId, int progress, const QString& status) = 0;
    
    /**
     * @brief 任务完成通知
     * @param taskId 任务ID
     */
    virtual void onTaskCompleted(const QString& taskId) = 0;
    
    /**
     * @brief 任务失败通知
     * @param taskId 任务ID
     * @param error 错误信息
     */
    virtual void onTaskFailed(const QString& taskId, const QString& error) = 0;
    
    /**
     * @brief 任务开始通知
     * @param taskId 任务ID
     */
    virtual void onTaskStarted(const QString& taskId) {}
    
    /**
     * @brief 任务取消通知
     * @param taskId 任务ID
     */
    virtual void onTaskCancelled(const QString& taskId) {}
};

#endif // ITASK_H
